/**
  ******************************************************************************
  * @file    spi.c
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-03-14
  * @brief   spi驱动,适用于PIC16(L)F1788_9
  *
  ******************************************************************************
  * @attention
  *
  * Change Logs:
  * Date          Author        Notes
  * 2024-03-14    ashuai0110    完成基本内容
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "spi.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/

/**
  * @brief  spi初始化(RC3-SCK RC4-SDI RC5-SDO)
  * @param  None
  * @retval None
  */
void spi_init(spi_config_t config)
{
    /* 修改对应引脚为输入输出 */
    if(SPI_MODE_SLAVE_CS == config.mode || SPI_MODE_SLAVE == config.mode)
    {
        TRISC3 = 1;
    }
    else
    {
        TRISC3 = 0;
    }
    TRISC4 = 1;
    TRISC5 = 0;
    SSP1CON1bits.SSPM = config.mode; /* MSSP的模式选择位 详见手册 */
    SMP = 0;
    if(SPI_MODE_MASTER == config.mode)
    {
        SSPADD = config.freqDiv - 1; /* MSSP波特率发生寄存器 */
    }
    CKE = config.cpha; /* 时钟相位 */
    CKP = config.cpol; /* 时钟极性 */
    SSP1IE = 0; /* 关闭中断 */
    SSP1IF = 0;
    SSPEN = 1; /* 使能MSSP */
}

/**
  * @brief  spi读写数据
  * @param  byte : 写入的数据
  * @retval 读出的数据
  */
uint8_t spi_rw(uint8_t byte)
{
    SSP1IF = 0;
    SSP1BUF = byte;
    while(SSP1IF == 0);
    SSP1IF = 0;
    
    return SSP1BUF;
}

